import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * @User: vitobo
 * @Date: 2024-05-29
 * @Description: 异常学习
 *
 *  错误: Java虚拟机无法解决的严重问题, 程序员自己解决
 *
 *  异常:
 *      程序执行过程中发生的不正常行为
 *  异常种类: (分类的依据就是执行的时间)
 *      受查异常/编译时异常  (主要发生在编译的时候, 需要处理)
 *          所以此时程序 如果想要编译, 必须处理掉这个异常,才能运行
 *      非受查异常/运行时异常  (主要发生在运行的时候, 需要处理)
 *          算数异常
 *          数组越界异常
 *          空指针异常
 *          输入不匹配异常
 *          类型不匹配的异常
 *
 *  当程序出现异常的时候, 程序就立即终止了; 如何处理异常??
 *      1.事前防御
 *      2.事后认错防御
 *      3.
 *
 *      通过try{}catch{}来处理异常
 *
 *
 *
 *
 */

class Config{

    // 异常捕获
    File file;
    public void openConfig(String filename) throws FileNotFoundException, IOException{
        if(filename.equals("config.ini")){
            throw new FileNotFoundException("配置文件名不正确!");
        }

        if(filename.endsWith(".ini")){
            throw new IOException("文件不是.ini文件");
        }
    }
}


// 自定义异常类
class UserNameException extends Exception{
    public UserNameException(String message){
        super(message);
    }
}

class PasswordException extends Exception{
    public PasswordException(String message){
        super(message);
    }
}

class Login{
    private String userName = "admin";
    private String password = "123456";

    public void loginInfo(String userName, String password)
        throws UserNameException,PasswordException{
        if(!userName.equals(userName)){
            throw new UserNameException("用户名错误");
        }
        if(!password.equals(password)){
            throw new PasswordException("密码错误");
        }

        System.out.println("登录成功");
    }
}
public class Test {

    public static void main(String[] args) {

        Login login = new Login();

        try {
            login.loginInfo("admin", "123456");
        }catch (UserNameException e){
            e.printStackTrace();
        }catch (PasswordException e){
            e.printStackTrace();
        }
    }
    // finally
    public static void main7(String[] args) {
        try{
            int[] arr = {1,2,3};
            arr[100] = 0;
            arr[0] = 10;
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println(e);
        }finally {
            System.out.println("finall中的代码一定会执行");
        }

        System.out.println("如果没有抛出异常，或者异常被处理了，try-catch后的代码也会执行");
    }

    public static void main6(String[] args) {
        int[] arr = {12,34,56};

        try {
            System.out.println("before");
            arr = null;
            System.out.println(arr[100]);
            System.out.println("after");
        }
        catch (NullPointerException e){
            e.printStackTrace();
        }catch(Exception e){
            e.printStackTrace();
        }

        System.out.println("afet try-catch");
    }

    public static void main5(String[] args) {
        int[] arr = {1,3,5};
        try{
            System.out.println("before");
            arr = null;
            System.out.println(arr[100]);
            System.out.println("after");
        }catch (ArrayIndexOutOfBoundsException e){
            System.out.println("数组下标越界异常");
            e.printStackTrace();
        }catch (NullPointerException e){
            System.out.println("空指针异常");
            e.printStackTrace();
        }

        System.out.println(" after try-catch");
    }

    public static void main4(String[] args) {
        try{
            int[] array = {1,3,4};
            System.out.println(array[5]);
        }catch (NullPointerException e){
            e.printStackTrace();
        }

        System.out.println("后续代码");
    }


    public static void main3(String[] args) {
        Config config = new Config();
        try{
            config.openConfig("config.txt");
            System.out.println("打开文件成功");
        }catch(IOException e){
            e.printStackTrace();
        }

        System.out.println("异常处理, 执行后续代码");

    }

    public static void main2(String[] args) throws IOException {
        Config config = new Config();
        config.openConfig("config.ini");

    }

    // 异常抛出
    public static int getElement(int[] array, int index){
        if(null == array){
            throw new NullPointerException("传递的数组为空");
        }
        if(index<0 || index>=array.length){
            throw new ArrayIndexOutOfBoundsException("传递的数组下标越界");
        }
        return array[index];
    }
    public static void main1(String[] args) {
        int[] array = {1,3,5,7,9};
        System.out.println(getElement(array, 3));
    }
}
